理解 MCP Server

MCP Server 是一种通过标准化协议接口,向 AI 应用程序提供特定能力的程序。

常见的 MCP Server 包括:

  • 文件系统 Server:用于访问文档
  • 数据库 Server:用于查询数据
  • GitHub Server:用于代码管理
  • Slack Server:用于团队沟通
  • 日历 Server:用于日程安排

MCP Server 的核心能力

MCP Server 主要通过三个构建模块提供功能:

能力说明示例控制方
Tools(工具)LLM 可以主动调用的函数,并根据用户请求决定什么时候使用。可以写数据库、调用外部 API、修改文件或执行其他逻辑。搜索航班、发送消息、创建日历事件模型
Resources(资源)被动的数据源,为 AI 提供只读上下文,例如文件内容、数据库 Schema、API 文档等。获取文档、访问知识库、读取日历应用程序
Prompts(提示词)预先定义好的指令模板,用来告诉模型如何使用特定的 Tools 和 Resources。制定旅行计划、总结会议、起草邮件用户

这三个能力可以组合起来完成比较复杂的任务。


一、Tools(工具)

Tools 允许 AI 模型执行实际操作

每个 Tool 都定义了一项具体操作,并规定输入和输出的数据类型。

模型根据当前上下文决定是否请求执行某个 Tool。

Tools 如何工作

Tools 是由 Schema 定义的接口,LLM 可以调用这些接口。

MCP 使用 JSON Schema 对 Tool 的输入进行验证。

每个 Tool 通常只负责一个明确的操作,并定义清晰的:

  • 输入参数
  • 输出结果

某些 Tool 在真正执行之前可能需要用户确认,从而保证用户始终能够控制 AI 所执行的操作。

对应的 MCP 协议操作

方法作用返回结果
tools/list查询可用的 Tool包含 Schema 的 Tool 定义数组
tools/call执行指定 ToolTool 的执行结果

例如,一个搜索航班的 Tool 可以定义为:

{
  name: "searchFlights",
  description: "搜索可用航班",
  inputSchema: {
    type: "object",
    properties: {
      origin: {
        type: "string",
        description: "出发城市"
      },
      destination: {
        type: "string",
        description: "到达城市"
      },
      date: {
        type: "string",
        format: "date",
        description: "出行日期"
      }
    },
    required: ["origin", "destination", "date"]
  }
}

二、Tools 的实际例子:旅行预订

假设 AI 正在帮助用户制定旅行计划。

它可以调用多个 Tool。

1. 搜索航班

searchFlights(
    origin: "NYC",
    destination: "Barcelona",
    date: "2024-06-15"
)

查询多家航空公司的航班,并返回结构化的航班信息。

2. 创建日历事件

createCalendarEvent(
    title: "Barcelona Trip",
    startDate: "2024-06-15",
    endDate: "2024-06-22"
)

将旅行日期添加到用户的日历中。

3. 发送邮件

sendEmail(
    to: "team@work.com",
    subject: "Out of Office",
    body: "..."
)

向同事发送自动的休假/离岗通知邮件。


三、Tools 的用户交互模型

Tools 属于**模型控制(model-controlled)**能力。

也就是说:

AI 模型可以发现有哪些 Tool,并根据用户的请求自动决定是否调用。

但是 MCP 同时强调人工监督

应用程序可以通过以下方式让用户保持控制权:

  • 在 UI 中显示可用的 Tools,让用户决定某个 Tool 是否可以用于当前对话
  • 每次执行 Tool 前弹出确认框
  • 对一些安全操作设置预授权
  • 记录 Tool 的执行日志以及执行结果

因此,并不是:

AI 想做什么 → 直接执行

而可以是:

AI 决定调用 Tool

应用程序检查权限

需要确认?
   ↙          ↘
 是            否
 ↓              ↓
用户确认       直接执行

    MCP Server

四、Resources(资源)

Resources 用于向 AI 应用提供结构化的上下文信息

与 Tools 不同,Resources 本身主要是读取数据,而不是执行操作。

例如:

  • 文件
  • API 数据
  • 数据库
  • 数据库 Schema
  • API 文档

Resources 如何工作

Resource 可以暴露来自各种数据源的信息。

AI 应用程序获取这些数据后,可以自行决定如何处理,例如:

  • 只选择相关的数据
  • 使用 Embedding 搜索相关内容
  • 使用关键词搜索
  • 直接将全部数据交给模型

每个 Resource 都具有一个唯一的 URI。

例如:

file:///path/to/document.md

同时会声明自己的 MIME Type,以便应用程序正确处理数据。


五、两种 Resource

MCP 支持两种 Resource 发现方式。

1. Direct Resources

直接指向固定数据的 URI。

例如:

calendar://events/2024

表示获取 2024 年的日历信息。

2. Resource Templates

动态 URI 模板,可以通过参数查询不同的数据。

例如:

travel://activities/{city}/{category}

可以根据:

  • 城市
  • 类别

动态查询旅游活动。

例如:

travel://activities/barcelona/museums

表示查询:

巴塞罗那的所有博物馆。

Resource Template 通常还包含:

  • title
  • description
  • MIME Type

因此它们本身具有较好的可发现性和自描述能力。


六、Resources 的协议操作

方法作用返回结果
resources/list获取可用的直接 ResourceResource 描述数组
resources/templates/list获取 Resource TemplateResource Template 定义数组
resources/read获取 Resource 内容Resource 数据及元数据
subscriptions/listen监听 Resource 变化更新通知流

如果 Client 希望监听某个 Resource 的变化,可以通过 subscriptions/listen 订阅。

当 Resource 发生变化时,Server 可以发送:

notifications/resources/updated

通知 Client。


七、Resource 实际例子

继续使用旅行规划的例子。

AI 应用可以访问:

calendar://events/2024

获取用户的日程。

file:///Documents/Travel/passport.pdf

读取旅行相关的重要文件。

trips://history/barcelona-2023

获取用户之前的巴塞罗那旅行记录。

AI 应用获取这些 Resources 后,可以自己决定如何处理。

例如:

Calendar

用户哪几天有空?

Travel Preferences

用户喜欢什么航空公司?
喜欢什么酒店?

Previous Trips

用户以前去过哪里?
喜欢哪些地方?

然后将这些信息提供给模型。


八、Resource Template

例如:

{
  "uriTemplate": "weather://forecast/{city}/{date}",
  "name": "weather-forecast",
  "title": "Weather Forecast",
  "description": "获取指定城市和日期的天气预报",
  "mimeType": "application/json"
}

以及:

{
  "uriTemplate": "travel://flights/{origin}/{destination}",
  "name": "flight-search",
  "title": "Flight Search",
  "description": "查询两个城市之间的可用航班",
  "mimeType": "application/json"
}

这样就可以进行动态查询。

例如:

weather://forecast/Paris/2026-08-20

或者:

travel://flights/NYC/Barcelona

九、参数补全(Parameter Completion)

动态 Resource 还支持参数补全。

例如用户输入:

weather://forecast/Par

系统可以提示:

Paris
Park City

又比如输入:

flights://search/JFK

系统可以提示:

JFK - John F. Kennedy International

这样用户就不需要准确记住参数的完整格式。


十、Resources 的用户交互模型

Resources 是由**应用程序驱动(application-driven)**的。

应用程序可以自由决定:

  • 如何获取 Resource
  • 如何处理 Resource
  • 如何向用户展示 Resource

常见的交互方式包括:

  • 类似文件夹的树形/列表结构
  • 搜索和过滤
  • 根据当前对话自动加入相关上下文
  • AI 智能推荐
  • 手动选择 Resource
  • 批量选择多个 Resource

MCP 协议不会强制规定 UI 应该长什么样

因此应用程序可以根据自己的需求设计 Resource Picker、预览功能、智能推荐等。


十一、Prompts(提示词)

Prompts 是可以重复使用的模板

MCP Server 作者可以提供针对某个领域的参数化 Prompt,也可以通过 Prompt 告诉用户:

如何更好地使用这个 MCP Server。


十二、Prompts 如何工作

Prompt 是结构化模板,可以定义:

  • 需要哪些输入
  • 输入参数类型
  • 交互方式
  • 使用哪些 Resource
  • 使用哪些 Tool

与 Resources 类似,Prompt 也支持参数补全。

但是一个非常重要的区别是:

Prompts 是用户控制的,需要用户主动调用,而不是模型自动触发。

Prompt 的协议操作

方法作用返回
prompts/list查询可用 PromptPrompt 描述数组
prompts/get获取 Prompt 详情完整 Prompt 定义及参数

十三、Prompt 示例

例如:

Plan a vacation

可以定义成一个旅行规划模板:

{
  "name": "plan-vacation",
  "title": "Plan a vacation",
  "description": "引导用户完成旅行规划",
  "arguments": [
    {
      "name": "destination",
      "type": "string",
      "required": true
    },
    {
      "name": "duration",
      "type": "number",
      "description": "旅行天数"
    },
    {
      "name": "budget",
      "type": "number",
      "required": false
    },
    {
      "name": "interests",
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  ]
}

用户不再需要自己写一大段自然语言,而是:

选择:
Plan a vacation

输入:
目的地:Barcelona
旅行时间:7 天
预算:$3000
兴趣:
  - beaches
  - architecture
  - food

然后系统根据这个模板执行一致的工作流程。


十四、Prompt 的用户交互

Prompt 同样是用户控制的

用户必须主动调用。

应用程序可以通过以下方式提供 Prompt:

Slash Commands

例如:

/plan-vacation

Command Palette

通过命令面板搜索 Prompt。

UI Button

例如提供:

[Plan a Vacation]

按钮。

Context Menu

根据当前上下文推荐相关 Prompt。

例如用户正在查看旅行信息时,可以自动显示:

Plan a vacation
Search flights
Find hotels

十五、多个 MCP Server 协同工作

MCP 真正强大的地方在于:

多个 MCP Server 可以组合起来,通过统一接口共同完成复杂任务。

例如,一个旅行 AI 应用可以连接三个 MCP Server:

Travel Server
    ├── 航班
    ├── 酒店
    └── 行程

Weather Server
    └── 天气

Calendar / Email Server
    ├── 日历
    └── 邮件

十六、完整的多 Server 旅行规划流程

用户首先调用:

plan-vacation

并提供:

{
  "destination": "Barcelona",
  "departure_date": "2024-06-15",
  "return_date": "2024-06-22",
  "budget": 3000,
  "travelers": 2
}

第一步:选择 Resources

用户选择:

calendar://my-calendar/June-2024

来自 Calendar Server。

travel://preferences/europe

来自 Travel Server。

travel://past-trips/Spain-2023

来自 Travel Server。


第二步:AI 读取上下文

AI 首先读取这些 Resources:

日历

判断用户什么时候有空

旅行偏好

了解用户喜欢的航空公司、酒店类型

历史旅行

了解用户以前喜欢哪些地方

第三步:调用 Tools

AI 根据这些上下文调用 Tools。

例如:

searchFlights()

查询:

NYC → Barcelona

然后:

checkWeather()

查询旅行日期的天气。


第四步:执行预订相关操作

AI 获取信息之后,可以继续执行:

bookHotel()

根据预算寻找酒店。

然后:

createCalendarEvent()

把旅行加入用户日历。

最后:

sendEmail()

发送旅行确认邮件。

必要的时候,这些操作需要用户确认。


十七、最终形成的完整架构

整个过程可以理解成:

                    AI Application

             ┌────────────┼────────────┐
             │            │            │
             ▼            ▼            ▼
        Travel Server  Weather Server  Calendar/Email
             │            │            │
        ┌────┴────┐       │       ┌────┴─────┐
        │         │       │       │          │
     Resources  Tools   Tools  Calendar    Email
        │         │       │       │          │
        └─────────┴───────┴───────┴──────────┘


                         AI

最终,用户只需要提出:

“帮我规划一次巴塞罗那旅行。”

MCP 就可以让 AI:

读取日历

读取旅行偏好

读取历史旅行记录

查询航班

查询天气

搜索酒店

用户确认

预订酒店

更新日历

发送邮件

也就是说,Resources 负责“给 AI 信息”,Tools 负责“让 AI 做事情”,Prompts 负责“告诉 AI 如何按照预定义流程工作”

这三个概念是理解 MCP Server 最重要的部分。